home *** CD-ROM | disk | FTP | other *** search
- /* $Id: batch.c,v 1.3 91/05/25 15:32:20 cap Exp $
- * Make a connection to tar, compress, and uuencode to batch up the
- * message and all its attachments.
- */
-
- #include <stdio.h>
- #include <ctype.h>
- #include <sys/types.h>
- #ifdef USG
- #include <sys/unistd.h>
- #else
- #include <sys/param.h>
- #include <sys/file.h>
- #endif
- #include <sys/stat.h>
- #include "config.h"
- #include "tnextmail.h"
-
- char command[MAXPATHLEN], attach_name[64], tar_uu_name[MAXPATHLEN];
- char **tolist; /* list of addressees */
- char *construct_attach_header();
- extern int lastattach;
- extern struct attach *attachments;
-
- /*
- * batch_message - make a system(3) call to tar, compress, and uuencode
- * to create the body of the message to be mailed.
- * Output is written to the file tar.uu in the temp
- * directory.
- */
-
- batch_message(tmpdir_name)
- char *tmpdir_name;
- {
- sprintf(tar_uu_name, "%s/tar.uu", tmpdir_name);
- sprintf(command, "%s cf - -C %s %s ", TAR, tmpdir_name, RTF_NAME);
- construct_filelist();
- strcat(command, "| compress | uuencode ");
- construct_batch_name();
- strcat(command, attach_name);
- strcat(command, " > ");
- strcat(command, tar_uu_name);
- #ifdef DEBUG
- fprintf(stderr, "I will run \"%s\"\n", command);
- #endif
- if (system(command) == 127) {
- perror("batching");
- fatalerrors++;
- return;
- }
- }
-
- /*
- * construct_filelist - make a list of the form
- * -C where index.rtf -C dir1 attach1
- * where 'where' is the location of the rtf
- * file, index.rtf is the rtf file, dir1 is the
- * directory in which attach1 is located, etc.
- */
-
- construct_filelist()
- {
- int i;
- char *cend;
-
- for (i = 0; i < lastattach; i++) {
- cend = &command[strlen(command)];
- sprintf(cend, "-C %s %s ", attachments[i].pathname, attachments[i].basename);
- }
- }
-
- /*
- * construct_batch_name - make the weird file name from the subject
- * line. The weird name is placed in the
- * global variable attach_name.
- */
-
- construct_batch_name()
- {
- int i;
- char *sp = message_subject, *bp = attach_name;
-
- if (message_subject[0])
- sp = message_subject;
- else
- sp = "No subject";
- sprintf(bp, ".tar.%d.", getpid());
- bp = &attach_name[strlen(attach_name)];
- for (i = 0; i < 17 && *sp; i++, sp++) {
- if (isalnum(*sp))
- *bp++ = *sp;
- else
- *bp++ = '_';
- }
- strcpy(bp, ".attach");
- }
-
- /*
- * check_file_access - make sure all attachments are readable. Print
- * out an error message and increment fatalerrors
- * for each unreadable file
- */
-
- check_file_access()
- {
- int i;
- char filename[MAXPATHLEN];
- struct stat stbuf;
-
- for (i = 0; i < lastattach; i++) {
- sprintf(filename, "%s%s", attachments[i].pathname,
- attachments[i].basename);
- if (access(filename, R_OK)) {
- perror(filename);
- fatalerrors++;
- } else if (stat(filename, &stbuf)) {
- perror(filename);
- fatalerrors++;
- }
- #if 0
- /*
- * I'm not sure we want this restriction at all. For one
- * thing, NeXT mail allows you to attach directories.
- * [cap 8/6/92]
- */
- else if (!(stbuf.st_mode & S_IFREG)) {
- fprintf(stderr, "Cannot mail %s; can mail only regular files.\n",
- filename);
- fatalerrors++;
- }
- #endif
- }
- }
-
- /*
- * construct_attach_header -
- * Make the "Next-Attachment:" line for the mail header. It is
- * constructed in static string space, and a pointer to it is
- * returned.
- */
-
- char *construct_attach_header()
- {
- static char header[128];
- struct stat stbuf;
- long blocks; /* weird NeXT blocks */
-
- if (stat(tar_uu_name, &stbuf)) {
- perror(tar_uu_name);
- fatalerrors++;
- return NULL;
- }
- /*
- * I don't know what the blocks field is used for, but according
- * to NeXT's specifications, it should be ceil(stbuf.st_size / 48) * 66
- */
- blocks = stbuf.st_size / 48;
- if (stbuf.st_size % 48)
- blocks++;
- blocks *= 66;
- sprintf(header, "Next-Attachment: %s, %ld, 1/1, %ld, 0",
- attach_name,
- stbuf.st_size,
- blocks);
- return header;
- }
-
- /*
- * mail_message - create the headers we add and send the message to
- * the mailer.
- */
-
- mail_message(tmpdir_name)
- char tmpdir_name[];
- {
- char *attach_header = construct_attach_header();
- char mailcmd[10240];
- char **tp;
- int c;
- FILE *mailpipe, *message;
-
- strcpy(mailcmd, MAILER);
- for (tp = tolist; *tp != NULL; tp++) {
- strcat(mailcmd, " ");
- strcat(mailcmd, *tp);
- }
- #if 0
- fprintf(stderr, "Mail command is \"%s\"\n", mailcmd);
- sprintf(mailcmd, "cat > /tmp/sent_to_mailer");
- #endif
- if ((mailpipe = popen(mailcmd, "w")) == NULL) {
- perror(mailcmd);
- fatalerrors++;
- return;
- }
- fprintf(mailpipe, "To:");
- for (tp = tolist; *tp != NULL; tp++)
- fprintf(mailpipe, " %s", *tp);
- if (message_subject[0])
- fprintf(mailpipe, "\nSubject: %s\n", message_subject);
- else
- putc('\n', mailpipe);
- fprintf(mailpipe, "%s\n\n", attach_header);
- if ((message = fopen(tar_uu_name, "r")) == NULL) {
- perror(tar_uu_name);
- pclose(mailpipe);
- fatalerrors++;
- return;
- }
- while ((c = getc(message)) != EOF)
- putc(c, mailpipe);
- fclose(message);
- pclose(mailpipe);
- }
-